{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Time Series Analysis\n",
    "\n",
    "One important area of application for information theory is time series analysis. Here, we will demonstrate how to compute the *modes of information flow* --- intrinsic, shared, and synergistic --- between the two dimensions of the [tinkerbell attractor](https://en.wikipedia.org/wiki/Tinkerbell_map)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "import dit\n",
    "from dit.inference import binned, dist_from_timeseries\n",
    "from dit.multivariate import total_correlation as I, intrinsic_total_correlation as IMI\n",
    "\n",
    "dit.ditParams['repr.print'] = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we define a few constants for this notebook:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "TRANSIENTS = 1000\n",
    "ITERATIONS = 1000000\n",
    "BINS = 3\n",
    "HISTORY_LENGTH = 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Generating the Time Series\n",
    "\n",
    "We write a generator for our two time series:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tinkerbell(x=None, y=None, a=0.9, b=-0.6013, c=2.0, d=0.5):\n",
    "    if x is None:\n",
    "        x = np.random.random() - 1\n",
    "    if y is None:\n",
    "        y = np.random.random() - 1\n",
    "    while True:\n",
    "        x, y = x**2 - y**2 + a*x + b*y, 2*x*y + c*x + d*y\n",
    "        yield x, y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And then we generate the time series:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "tb = tinkerbell()\n",
    "\n",
    "# throw away transients\n",
    "[next(tb) for _ in range(TRANSIENTS)]\n",
    "\n",
    "time_series = np.asarray([next(tb) for _ in range(ITERATIONS)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And we plot the attractor because it's pretty:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7f0d3b027940>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.scatter(time_series[:,0], time_series[:,1], alpha=0.1, s=0.01)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Discretizing the Time Series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "binary_time_series = binned(time_series, bins=BINS)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 1]\n",
      " [1 0]\n",
      " [1 1]\n",
      " [2 1]\n",
      " [2 2]\n",
      " [2 2]\n",
      " [1 2]\n",
      " [0 2]\n",
      " [0 0]\n",
      " [0 1]]\n"
     ]
    }
   ],
   "source": [
    "print(binary_time_series[:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Constructing a Distribution from the Time Series"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "time_series_distribution = dist_from_timeseries(binary_time_series, history_length=HISTORY_LENGTH)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><div style=\"float: left\"><table border=\"1\"><tr><th>Class:</th><td>Distribution</td></tr><tr><th>Alphabet:</th><td>(((0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)), ((0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)), (0, 1, 2), (0, 1, 2))</td></tr><tr><th>Base:</th><td>linear</td></tr><tr><th>Outcome Class:</th><td>tuple</td></tr><tr><th>Outcome Lenght:</th><td>4</td></tr></table></div><div style=\"float: left\"><table><tr><th>x[0]</th><th>x[1]</th><th>x[2]</th><th>x[3]</th><th>p(x)</th></tr><tr><td>(0, 0)</td><td>(0, 0)</td><td>0</td><td>1</td><td>0.000791001582003164</td></tr><tr><td>(0, 0)</td><td>(0, 0)</td><td>1</td><td>0</td><td>0.0165750331500663</td></tr><tr><td>(0, 0)</td><td>(0, 0)</td><td>1</td><td>1</td><td>0.002034004068008136</td></tr><tr><td>(0, 0)</td><td>(0, 1)</td><td>1</td><td>0</td><td>0.024921049842099686</td></tr><tr><td>(0, 0)</td><td>(0, 1)</td><td>1</td><td>1</td><td>0.000791001582003164</td></tr><tr><td>(0, 0)</td><td>(0, 1)</td><td>2</td><td>0</td><td>0.02855305710611421</td></tr><tr><td>(0, 0)</td><td>(0, 2)</td><td>1</td><td>0</td><td>1.6000032000064e-05</td></tr><tr><td>(0, 0)</td><td>(0, 2)</td><td>2</td><td>0</td><td>3.000006000012e-06</td></tr><tr><td>(0, 0)</td><td>(2, 0)</td><td>0</td><td>0</td><td>0.01250002500005</td></tr><tr><td>(0, 0)</td><td>(2, 0)</td><td>0</td><td>1</td><td>0.03705707411414823</td></tr><tr><td>(0, 0)</td><td>(2, 0)</td><td>1</td><td>0</td><td>0.009256018512037023</td></tr><tr><td>(0, 0)</td><td>(2, 1)</td><td>1</td><td>0</td><td>0.001536003072006144</td></tr><tr><td>(0, 1)</td><td>(0, 0)</td><td>0</td><td>1</td><td>0.029981059962119923</td></tr><tr><td>(0, 1)</td><td>(0, 0)</td><td>1</td><td>1</td><td>0.025474050948101897</td></tr><tr><td>(0, 1)</td><td>(0, 1)</td><td>1</td><td>1</td><td>0.002034004068008136</td></tr><tr><td>(0, 1)</td><td>(1, 0)</td><td>0</td><td>0</td><td>0.013786027572055144</td></tr><tr><td>(0, 1)</td><td>(1, 0)</td><td>0</td><td>1</td><td>0.01912203824407649</td></tr><tr><td>(0, 1)</td><td>(1, 0)</td><td>1</td><td>1</td><td>0.04781009562019124</td></tr><tr><td>(0, 1)</td><td>(1, 1)</td><td>1</td><td>1</td><td>0.006994013988027976</td></tr><tr><td>(0, 1)</td><td>(2, 0)</td><td>0</td><td>0</td><td>0.01137002274004548</td></tr><tr><td>(0, 1)</td><td>(2, 0)</td><td>0</td><td>1</td><td>0.001142002284004568</td></tr><tr><td>(0, 2)</td><td>(0, 0)</td><td>0</td><td>0</td><td>0.009994019988039976</td></tr><tr><td>(0, 2)</td><td>(0, 0)</td><td>0</td><td>1</td><td>0.001797003594007188</td></tr><tr><td>(0, 2)</td><td>(0, 0)</td><td>1</td><td>1</td><td>9.7000194000388e-05</td></tr><tr><td>(0, 2)</td><td>(1, 0)</td><td>0</td><td>0</td><td>0.02969505939011878</td></tr><tr><td>(0, 2)</td><td>(2, 0)</td><td>0</td><td>0</td><td>3.000006000012e-06</td></tr><tr><td>(1, 0)</td><td>(0, 0)</td><td>1</td><td>0</td><td>0.014083028166056333</td></tr><tr><td>(1, 0)</td><td>(0, 0)</td><td>2</td><td>0</td><td>0.011073022146044291</td></tr><tr><td>(1, 0)</td><td>(0, 1)</td><td>1</td><td>0</td><td>0.0432250864501729</td></tr><tr><td>(1, 0)</td><td>(0, 1)</td><td>1</td><td>1</td><td>0.005878011756023512</td></tr><tr><td>(1, 0)</td><td>(0, 1)</td><td>2</td><td>0</td><td>0.001142002284004568</td></tr><tr><td>(1, 0)</td><td>(2, 1)</td><td>1</td><td>0</td><td>0.009563019126038252</td></tr><tr><td>(1, 0)</td><td>(2, 2)</td><td>0</td><td>0</td><td>0.014768029536059072</td></tr><tr><td>(1, 0)</td><td>(2, 2)</td><td>1</td><td>0</td><td>0.012496024992049984</td></tr><tr><td>(1, 1)</td><td>(0, 1)</td><td>1</td><td>1</td><td>0.04849309698619397</td></tr><tr><td>(1, 1)</td><td>(0, 1)</td><td>2</td><td>1</td><td>0.024791049582099163</td></tr><tr><td>(1, 1)</td><td>(1, 1)</td><td>1</td><td>1</td><td>0.007794015588031176</td></tr><tr><td>(1, 1)</td><td>(1, 1)</td><td>2</td><td>1</td><td>0.04331508663017326</td></tr><tr><td>(1, 1)</td><td>(1, 1)</td><td>2</td><td>2</td><td>0.014303028606057212</td></tr><tr><td>(1, 2)</td><td>(1, 1)</td><td>2</td><td>2</td><td>0.06810613621227242</td></tr><tr><td>(1, 2)</td><td>(1, 2)</td><td>2</td><td>2</td><td>0.014303028606057212</td></tr><tr><td>(2, 0)</td><td>(0, 0)</td><td>0</td><td>0</td><td>0.0069000138000276</td></tr><tr><td>(2, 0)</td><td>(0, 0)</td><td>0</td><td>1</td><td>0.01641703283406567</td></tr><tr><td>(2, 0)</td><td>(0, 0)</td><td>0</td><td>2</td><td>1.9000038000076e-05</td></tr><tr><td>(2, 0)</td><td>(0, 0)</td><td>1</td><td>0</td><td>0.015541031082062165</td></tr><tr><td>(2, 0)</td><td>(0, 0)</td><td>2</td><td>0</td><td>0.00081500163000326</td></tr><tr><td>(2, 0)</td><td>(0, 1)</td><td>1</td><td>0</td><td>0.001472002944005888</td></tr><tr><td>(2, 0)</td><td>(0, 1)</td><td>1</td><td>1</td><td>0.0003250006500013</td></tr><tr><td>(2, 0)</td><td>(2, 2)</td><td>0</td><td>0</td><td>0.04404608809217619</td></tr><tr><td>(2, 0)</td><td>(2, 2)</td><td>0</td><td>1</td><td>0.001536003072006144</td></tr><tr><td>(2, 1)</td><td>(0, 1)</td><td>1</td><td>1</td><td>9.7000194000388e-05</td></tr><tr><td>(2, 1)</td><td>(2, 2)</td><td>0</td><td>1</td><td>0.009563019126038252</td></tr><tr><td>(2, 1)</td><td>(2, 2)</td><td>0</td><td>2</td><td>0.027264054528109056</td></tr><tr><td>(2, 2)</td><td>(1, 2)</td><td>2</td><td>2</td><td>0.06810613621227242</td></tr><tr><td>(2, 2)</td><td>(2, 2)</td><td>0</td><td>2</td><td>0.045582091164182326</td></tr><tr><td>(2, 2)</td><td>(2, 2)</td><td>1</td><td>2</td><td>0.03682707365414731</td></tr><tr><td>(2, 2)</td><td>(2, 2)</td><td>2</td><td>2</td><td>0.058823117646235296</td></tr></table></div></div>"
      ],
      "text/plain": [
       "Class:          Distribution\n",
       "Alphabet:       (((0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)), ((0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)), (0, 1, 2), (0, 1, 2))\n",
       "Base:           linear\n",
       "Outcome Class:  tuple\n",
       "Outcome Length: 4\n",
       "RV Names:       None\n",
       "\n",
       "x                        p(x)\n",
       "((0, 0), (0, 0), 0, 1)   0.000791001582003164\n",
       "((0, 0), (0, 0), 1, 0)   0.0165750331500663\n",
       "((0, 0), (0, 0), 1, 1)   0.002034004068008136\n",
       "((0, 0), (0, 1), 1, 0)   0.024921049842099686\n",
       "((0, 0), (0, 1), 1, 1)   0.000791001582003164\n",
       "((0, 0), (0, 1), 2, 0)   0.02855305710611421\n",
       "((0, 0), (0, 2), 1, 0)   1.6000032000064e-05\n",
       "((0, 0), (0, 2), 2, 0)   3.000006000012e-06\n",
       "((0, 0), (2, 0), 0, 0)   0.01250002500005\n",
       "((0, 0), (2, 0), 0, 1)   0.03705707411414823\n",
       "((0, 0), (2, 0), 1, 0)   0.009256018512037023\n",
       "((0, 0), (2, 1), 1, 0)   0.001536003072006144\n",
       "((0, 1), (0, 0), 0, 1)   0.029981059962119923\n",
       "((0, 1), (0, 0), 1, 1)   0.025474050948101897\n",
       "((0, 1), (0, 1), 1, 1)   0.002034004068008136\n",
       "((0, 1), (1, 0), 0, 0)   0.013786027572055144\n",
       "((0, 1), (1, 0), 0, 1)   0.01912203824407649\n",
       "((0, 1), (1, 0), 1, 1)   0.04781009562019124\n",
       "((0, 1), (1, 1), 1, 1)   0.006994013988027976\n",
       "((0, 1), (2, 0), 0, 0)   0.01137002274004548\n",
       "((0, 1), (2, 0), 0, 1)   0.001142002284004568\n",
       "((0, 2), (0, 0), 0, 0)   0.009994019988039976\n",
       "((0, 2), (0, 0), 0, 1)   0.001797003594007188\n",
       "((0, 2), (0, 0), 1, 1)   9.7000194000388e-05\n",
       "((0, 2), (1, 0), 0, 0)   0.02969505939011878\n",
       "((0, 2), (2, 0), 0, 0)   3.000006000012e-06\n",
       "((1, 0), (0, 0), 1, 0)   0.014083028166056333\n",
       "((1, 0), (0, 0), 2, 0)   0.011073022146044291\n",
       "((1, 0), (0, 1), 1, 0)   0.0432250864501729\n",
       "((1, 0), (0, 1), 1, 1)   0.005878011756023512\n",
       "((1, 0), (0, 1), 2, 0)   0.001142002284004568\n",
       "((1, 0), (2, 1), 1, 0)   0.009563019126038252\n",
       "((1, 0), (2, 2), 0, 0)   0.014768029536059072\n",
       "((1, 0), (2, 2), 1, 0)   0.012496024992049984\n",
       "((1, 1), (0, 1), 1, 1)   0.04849309698619397\n",
       "((1, 1), (0, 1), 2, 1)   0.024791049582099163\n",
       "((1, 1), (1, 1), 1, 1)   0.007794015588031176\n",
       "((1, 1), (1, 1), 2, 1)   0.04331508663017326\n",
       "((1, 1), (1, 1), 2, 2)   0.014303028606057212\n",
       "((1, 2), (1, 1), 2, 2)   0.06810613621227242\n",
       "((1, 2), (1, 2), 2, 2)   0.014303028606057212\n",
       "((2, 0), (0, 0), 0, 0)   0.0069000138000276\n",
       "((2, 0), (0, 0), 0, 1)   0.01641703283406567\n",
       "((2, 0), (0, 0), 0, 2)   1.9000038000076e-05\n",
       "((2, 0), (0, 0), 1, 0)   0.015541031082062165\n",
       "((2, 0), (0, 0), 2, 0)   0.00081500163000326\n",
       "((2, 0), (0, 1), 1, 0)   0.001472002944005888\n",
       "((2, 0), (0, 1), 1, 1)   0.0003250006500013\n",
       "((2, 0), (2, 2), 0, 0)   0.04404608809217619\n",
       "((2, 0), (2, 2), 0, 1)   0.001536003072006144\n",
       "((2, 1), (0, 1), 1, 1)   9.7000194000388e-05\n",
       "((2, 1), (2, 2), 0, 1)   0.009563019126038252\n",
       "((2, 1), (2, 2), 0, 2)   0.027264054528109056\n",
       "((2, 2), (1, 2), 2, 2)   0.06810613621227242\n",
       "((2, 2), (2, 2), 0, 2)   0.045582091164182326\n",
       "((2, 2), (2, 2), 1, 2)   0.03682707365414731\n",
       "((2, 2), (2, 2), 2, 2)   0.058823117646235296"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "time_series_distribution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we assign helpful variable names to the indicies of the distribution:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_past = [0]\n",
    "y_past = [1]\n",
    "x_pres = [2]\n",
    "y_pres = [3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Measuring the Modes of Information Flow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "intrinsic_x_to_y = IMI(time_series_distribution, [x_past, y_pres], y_past)\n",
    "time_delayed_mutual_information_x_to_y = I(time_series_distribution, [x_past, y_pres])\n",
    "transfer_entropy_x_to_y = I(time_series_distribution, [x_past, y_pres], y_past)\n",
    "\n",
    "shared_x_to_y = time_delayed_mutual_information_x_to_y - intrinsic_x_to_y\n",
    "synergistic_x_to_y = transfer_entropy_x_to_y - intrinsic_x_to_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Flows from x to y:\n",
      "\tIntrinsic: 0.5504300355821599\n",
      "\tShared: 0.6097942892490416\n",
      "\tSynergistic: 0.07758345827849134\n"
     ]
    }
   ],
   "source": [
    "print(f\"Flows from x to y:\\n\\tIntrinsic: {intrinsic_x_to_y}\\n\\tShared: {shared_x_to_y}\\n\\tSynergistic: {synergistic_x_to_y}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "intrinsic_y_to_x = IMI(time_series_distribution, [y_past, x_pres], x_past)\n",
    "time_delayed_mutual_informtaion_y_to_x = I(time_series_distribution, [y_past, x_pres])\n",
    "transfer_entropy_y_to_x = I(time_series_distribution, [y_past, x_pres], x_past)\n",
    "\n",
    "shared_y_to_x = time_delayed_mutual_informtaion_y_to_x - intrinsic_y_to_x\n",
    "synergistic_y_to_x = transfer_entropy_y_to_x - intrinsic_y_to_x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Flows from y to x:\n",
      "\tIntrinsic: 0.29978807681976516\n",
      "\tShared: 0.3536562545354385\n",
      "\tSynergistic: 0.013492692619592628\n"
     ]
    }
   ],
   "source": [
    "print(f\"Flows from y to x:\\n\\tIntrinsic: {intrinsic_y_to_x}\\n\\tShared: {shared_y_to_x}\\n\\tSynergistic: {synergistic_y_to_x}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
